package Comprehensive_01;

import java.util.Arrays;

public class ArraysUtil {
    // Arrays工具包
    public static void main(String[] args) {
        // toString: 将数组变成字符串
        System.out.println("-------------------toString---------------");
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        System.out.println(Arrays.toString(arr));

        // binarySearch:二分查找法查找元素
        // 细节：二分查找法前提是：数组中元素必须是有序的，数组中元素必须是升序的
        System.out.println("------------------binarySearch");
        System.out.println(Arrays.binarySearch(arr, 10)); // 返回的是下标索引值9
        System.out.println(Arrays.binarySearch(arr, 2)); // 返回的是下标索引值1
        // 当要查找的元素不在数组中时，返回值为：该元素应该插入的位置减一 ，- 插入值 - 1
        System.out.println(Arrays.binarySearch(arr, -20));


        // copyOf：拷贝数组
        System.out.println("---------------------copyOf---------------------");
        // 如果新数组长度小于等于原数组长度 则正常拷贝数组元素
        // 如果新数组长度大于原数组长度，则不足的部分以初始化值填充
        int[] newArr = Arrays.copyOf(arr, 5);
        System.out.println(Arrays.toString(newArr));


        // copyOdRange: 拷贝数组（指定范围）
        System.out.println("----------------------copyRange------------------");
        // copyOfRange(原数组，原数组索引，新数组索引)
        // 如果新数组索引小于等于原数组索引 则正常拷贝数组元素
        // 如果新数组索引大于原数组索引，则不足的部分以初始化值填充
        int[] newArr2 = Arrays.copyOfRange(arr, 2, 20);
        System.out.println(Arrays.toString(newArr2));


        // fill：填充数组
        System.out.println("----------------------fill-------------------------");
        Arrays.fill(arr, 10);
        System.out.println(Arrays.toString(arr));


        // sort:对数组进行排序。默认情况下，给基本数据类型进行升序排序，底层使用的是快速排序
        System.out.println("--------------------sort------------------------");
        int[] arr2 = {1, 4, 5, 3, 2, 5, 7, 6, 9, 10};
        Arrays.sort(arr2);
        System.out.println(Arrays.toString(arr2));


        /* public static void sort(数组，排序规则) 按照指定的规则进行排序

           参数一：要排序的数组
           参数二：排序的规则
           细节：
                只能给引用数据类型的数组进行排序
                如果数组是基本数据类型，则需要变成对应的封装类型
         */
        System.out.println("-----------------------sort排序规则--------------------");
        Integer[] arr3 = {1, 4, 5, 3, 2, 5, 7, 6, 9, 10};

        // 第二个参数是一个接口，所以我们调用方法时，需要传入这个接口实现类的对象作为排序的规则
        // 但是这个实现类，我只要使用一次，所以没必要单独去写一个，此时则需要使用匿名内部类

        // 底层原理：
        // 利用插入排序 + 二分查找的方式进行排序
        // 默认把0 索引的数据类型当作有序的序列 1 索引到最后认为是无序的序列
        // 遍历无序的序列得到里面的每一个元素，假设当前遍历到的元素是A元素
        // 把A 往有序序列中进行插入，在插入的时候，是利用二分查找确定A的插入点。
        // 拿着A元素，和插入点的元素进行比较，比较的规则就是compare方法的方法体
        // 如果方法返回的是负数，拿着A继续跟前面的数据进行比较
        // 如果方法返回的是正数，拿着A继续跟后面的数据进行比较
        // 如果方法返回的是0，拿着A继续跟后面的数据进行比较
        // 直到能确定A的最终位置为止

        // compare方法的形参：
        // 参数一 o1：表示在无序序列中，遍历得到每一个元素
        // 参数二 o2：在有序序列中的元素

        // 返回值：
        // 负数：表示当前要插入的元素是小的，放在前面
        // 正数：表示当前要插入的元素是大的，放在后面
        // 0：表示当前要插入的元素跟现在的元素比是一样的我们也会放在后面
        /*Arrays.sort(arr3, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        });*/

        Arrays.sort(arr3, (Integer o1 ,Integer o2) -> {return o2 - o1;}); // lambda 表达式
        System.out.println(Arrays.toString(arr3));

    }
}
